package com.example.gradu.graduationproject.service.impl;

import com.example.gradu.graduationproject.domain.Code;
import com.example.gradu.graduationproject.domain.User;
import com.example.gradu.graduationproject.mapper.UserMapper;
import com.example.gradu.graduationproject.service.CodeService;
import com.example.gradu.graduationproject.service.UserService;
import com.example.gradu.graduationproject.util.R;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * 用户表(User)表服务实现类
 *
 * @author makejava
 * @since 2025-02-12 16:19:20
 */
@Service("userService")
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;
    @Autowired
    private JavaMailSender mailSender;
    @Resource
    private CodeService codeService;

    /**
     * 通过ID查询单条数据
     *
     * @param userid 主键
     * @return 实例对象
     */
    @Override
    public R<User> queryById(Integer userid) {
        return R.<User>ok().setData(this.userMapper.queryById(userid));
    }

    /**
     * 全查询
     *
     * @param user 筛选条件
     * @return 查询结果
     */
    @Override
    public R<List<User>> queryAll(User user) {
        return R.<List<User>>ok().setData(this.userMapper.queryAll(user));
    }

    /**
     * 新增数据
     *
     * @param user 实例对象
     * @return 实例对象
     */
    @Override
    public R insert(User user) {
        this.userMapper.insert(user);
        return R.ok().setData(user);
    }

    /**
     * 修改数据
     *
     * @param user 实例对象
     * @return 实例对象
     */
    @Override
    public R update(User user) {
        this.userMapper.update(user);
        return R.ok().setData(this.queryById(user.getUserid()));
    }

    /**
     * 通过主键删除数据
     *
     * @param userid 主键
     * @return 是否成功
     */
    @Override
    public R deleteById(Integer userid) {
        boolean del = this.userMapper.deleteById(userid) > 0;
        return R.ok().setData(del);
    }

    /**
     * 通过账户和密码组合登录
     *
     * @param user 用户信息，仅填写email和password
     * @return 是否存在该账户密码组合的账户
     */
    @Override
    public R loginByEmailPwd(User user) {
        boolean login = this.userMapper.queryAll(user).size() > 0 ;
        if(login){
            System.out.println("登录成功: "+user.getEmail());
        }
        return R.ok().setData(login);
    }

    /**
     * 生成验随机证码
     * @return 验证码
     */
    public String randomCode(){
        StringBuilder str = new StringBuilder();
        Random random = new Random();
        for(int i = 0; i < 6;i++){
            str.append(random.nextInt(10));
        }
        return str.toString();
    }

    /**
     * 发送邮件
     *
     * @param user 邮箱
     * @return 发送情况
     */
    @Override
    public R send(User user) {
        Map<String, Object> map = new HashMap<>();
//        判断是否提交了邮箱
        if(StringUtils.isEmpty(user.getEmail())){
            map.put("date","null");
            map.put("msg","请提交账号");
            return R.ok().setData(map);
        }
        String code;
        try {
            SimpleMailMessage mailMessage = new SimpleMailMessage();
//            主题
            mailMessage.setSubject("验证码邮件");
//            生成随机数
            code = randomCode();
//            内容
            mailMessage.setText("您收到的验证码是: "+code);
//            发给谁
            mailMessage.setTo(user.getEmail());
//            管理员的邮箱
            mailMessage.setFrom("2662258652@qq.com");
//            发送
            mailSender.send(mailMessage);
        }catch (Exception e){
            e.printStackTrace();
            map.put("date",null);
            map.put("msg","数据异常");
            return R.ok().setData(map);
        }
//        将验证码存入数据库
        Code code1 = new Code();
        code1.setCode(code);
        code1.setEmail(user.getEmail());
        code1.setIsDeletedCode("0");
        codeService.insert(code1);

        map.put("code",code);
        map.put("msg","发送成功");
        System.out.println("发送邮件成功到: "+user.getEmail());
        return R.ok().setData(map);
    }

    @Override
    public R RegisByEmail(User user,String code) {
        Map<String,Object> map = new HashMap<>();
        if(StringUtils.isEmpty(code)){
//            没输入验证码
            map.put("date",null);
            map.put("msg","验证码不能为空");
            return R.ok().setData(map);
        }
//        判断邮箱是否存在
        if(StringUtils.isEmpty(user.getEmail())){
            map.put("date",null);
            map.put("msg","邮箱不能为空");
            return R.ok().setData(map);
        }
//        获取验证码
        Code code1 = new Code();
        code1.setEmail(user.getEmail());
        List<Code> users = codeService.queryAll(code1).getData();
        String codeDB = users.get(users.size() - 1).getCode();
//        验证码是否正确
        if(codeDB.equals(code)){
            user.setRights("PU");  // 普通用户
            user.setIsDeletedUser(0);  // 账户有效
            R res = insert(user);
//            正确，注册成功
            map.put("date",user.getEmail());
            map.put("msg",res.getCode());
            System.out.println("注册成功:  "+user);
        }else {
//            不正确
            map.put("date",null);
            map.put("msg","验证码不对");
        }
        return R.ok().setData(map);

    }
}

